import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;

// Класс DictNumb наследуется от BaseDict и переопределяет некоторые методы
public class DictNumb extends BaseDict {

    // Конструктор по умолчанию
    DictNumb() {}

    // Поле для хранения маски ключей, соответствует строке из 5 цифр
    private final String mask = "[0-9]{5}";

    // Переопределенный метод для проверки ключа на соответствие маске и непустоту
    @Override
    public boolean Check(String key){
        return key.matches(this.getMask()) && !key.isBlank();
    }

    // Конструктор, принимающий список элементов
    DictNumb(ArrayList<Elem> keyValues) {
        // Вызываем конструктор базового класса
        super(keyValues);
        // Создаем новый список для элементов, прошедших проверку
        ArrayList<Elem> checkedKeys = new ArrayList<>();
        // Проверяем каждый элемент на соответствие маске
        for (Elem elem : keyValues) {
            if (Check(elem.getKey())) {
                checkedKeys.add(elem);
            }
        }
        // Устанавливаем список прошедших проверку элементов в baseDict
        setBaseDict(checkedKeys);
    }

    // Переопределенный метод для получения маски ключей
    @Override
    public String getMask() {
        return mask;
    }

    // Переопределенный метод для десериализации словаря из файла
    @SuppressWarnings("unchecked")
    @Override
    public void deserialize(String fileName) {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName + ".ser"))) {
            // Читаем объект из файла и приводим его к типу ArrayList<Elem>
            ArrayList<Elem> dict = (ArrayList<Elem>) ois.readObject();
            // Создаем новый список для элементов, прошедших проверку
            ArrayList<Elem> newDict = new ArrayList<>();
            // Проверяем каждый элемент на соответствие маске
            for (Elem el : dict) {
                if (Check(el.getKey())) {
                    newDict.add(el);
                }
            }
            // Устанавливаем список прошедших проверку элементов в baseDict
            setBaseDict(newDict);
        } catch (Exception e) {
            // Обрабатываем исключения, если произошла ошибка
            e.printStackTrace();
        }
    }
}
